﻿// 1575：【例 1】二叉苹果树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>

using  namespace std;

/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1575
https://loj.ac/p/10153

有一棵二叉苹果树，如果数字有分叉，一定是分两叉，即没有只有一个儿子的节点。
这棵树共 N 个节点，标号 1 至 N，树根编号一定为 1。

我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵有四根树枝的苹果树，因为树枝太多了，需要剪枝。
但是一些树枝上长有苹果，给定需要保留的树枝数量，求最多能留住多少苹果。

【输入】
第一行两个数 N 和 Q
 ，N表示树的节点数，Q表示要保留的树枝数量。

接下来 N−1行描述树枝信息，每行三个整数，前两个是它连接的节点的编号，第三个数是这根树枝上苹果数量。
 
【输出】
输出仅一行，表示最多能留住的苹果的数量。

【输入样例】
5 2
1 3 1
1 4 10
2 3 20
3 5 20
【输出样例】
21

 
5 3
1 2 0
1 5 1
5 3 100
5 4 1


数据范围与提示
对于 100\% 的数据，1<= Q <= N <= 100, N!= 1，每根树枝上苹果不超过 30000 个。
*/
const int N = 105, M = 205;
int h[N], e[M], w[M], ne[M], idx;
int n, q;
int dp[N][N];

void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int x, int father) {
	int p1 = -1; int w1 = -1; int p2 = -1; int w2 = -1;

	for (int i = h[x]; i != -1; i=ne[i]) {
		int j = e[i];
		if (j == father) continue;
		if (p1 == -1) {
			p1 = j, w1 = w[i];
		}
		else {
			p2 = j, w2 = w[i];
		}
		dfs(j, x);
	}

	dp[x][0] = 0;

	if (-1 != p1) {
		dp[x][1] = max(w1, w2);
		for (int i = 2; i <= q; i++) {
			dp[x][i] = max(dp[x][i], max(dp[p1][i - 1] + w1, dp[p2][i - 1] + w2));
			for (int j = 1; j < i; j++) {
				dp[x][i] = max(dp[x][i], dp[p1][j-1] + w1 + dp[p2][i - j-1] + w2);
			}
		}
	}
	
	return 0;
}


int main()
{
	memset(h, -1, sizeof h);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			dp[i][j] = -0x3f3f3f3f;
		}
	}
	cin >> n >> q;
	for (int i = 1; i < n; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c); add(b, a, c);
	}

	dfs(1,-1);

	cout << dp[1][q] << endl;


	return 0;
}

 